package classes;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import interfaces.Estoque;
import objetos.MarcaObj;
import objetos.VendaObj;
import objetos.FornecedorObj;
import objetos.ItemVendaObj;
import interfaces.Venda;
import interfaces.CartaoFidelidade;
public class VendaImpl implements Venda{

	@Override
	public float calcularFrete(String cep) {
		String finall = cep.split("-" )[1];
		return Integer.parseInt(finall) / 10;
	}

	@Override
	public boolean cancelarVenda(int codigoVenda) {
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			stm.execute("UPDATE vendas SET cancelado = true WHERE id = " + codigoVenda);
		} catch(IOException e) {
			System.out.println(e);
			return false;
		} catch(SQLException e) {
			System.out.println(e);
			return false;
		} catch(ClassNotFoundException e) {
			System.out.println(e);
			return false;
		}
		return true;
	}

	@Override
	public void definirFormaPagamento(float valorVenda) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean efetuarVenda(VendaObj Venda,
			LinkedList<ItemVendaObj> produtos) {
		try{
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm  = con.createStatement();
			EstoqueImpl Ei = new EstoqueImpl();
			CarrinhoCompraImpl CCI= new CarrinhoCompraImpl();
			Float total = new Float(0);
			
			String vendaEfetuadaBoolean = new String();
			String pagamentoEfetuadoBoolean = new String();
			String numCartao = Venda.getNumero_cartao();
			String codigoBoleto = Venda.getCodigo_boleto();
			if( Venda.isVenda_finalizada() ) vendaEfetuadaBoolean = "true";
			else vendaEfetuadaBoolean = "false";
			if( Venda.isPagamento_efetuado() ) pagamentoEfetuadoBoolean = "true";
			else pagamentoEfetuadoBoolean = "false";
			if( numCartao == null ) numCartao = "null";
			if( codigoBoleto == null ) codigoBoleto = "null";
			
			for ( int i = 0; i < produtos.size(); i++ ) {
				total += produtos.get(i).getQuantidade()*produtos.get(i).getProduto().getPreco();
			}
			
			stm.execute("INSERT INTO vendas VALUES (default," +
					Venda.getCliente_id() + "," +
					vendaEfetuadaBoolean + "," +
					pagamentoEfetuadoBoolean + "," +
					QueryAssist.stringValue(numCartao) + "," +
					QueryAssist.stringValue(codigoBoleto) + "," +
					QueryAssist.stringValue(Venda.getNota_fiscal()) + "," +
					total + ",false)"					
					);
			ResultSet result = stm.executeQuery("SELECT max(id) FROM vendas WHERE "  
					  + "Cliente_id =" + Venda.getCliente_id() ); 
			while (result.next()){
				Venda.setId(result.getInt(1));}
			result.close();
			for(int i =0; i < produtos.size() ;i++){
				stm.execute("insert into venda_produto values (default, '"
						+ Venda.getId() + "', "
						+ produtos.get(i).getProduto().getId() + ","
						+ produtos.get(i).getQuantidade() + ","
						+ produtos.get(i).getProduto().getPreco() +")" );
				Ei.operarSobreEstoque(produtos.get(i).getProduto().getId(),( produtos.get(i).getQuantidade()*(-1)));
			}
			int pontos;
			pontos =  total.intValue();
			pontos = pontos/10;
			CartaoFidelidade CF = new CartaoFidelidadeImpl();
			CF.adicionarPontos(Venda.getCliente_id(),pontos);
			CCI.limparCarrinho(Venda.getCliente_id());			
	} catch(IOException e) {
		System.out.println(e);
		return false;
	} catch(SQLException e) {
		System.out.println(e);
		return false;
	} catch(ClassNotFoundException e) {
		System.out.println(e);
		return false;
	}
	return true;

}

	@Override
	public LinkedList<VendaObj> historicoVendasCliente(int codigoCliente) {
		LinkedList<VendaObj> Resultado;
		Resultado = new LinkedList<VendaObj>();
		try {
			DataSource.init();
			Connection con = DataSource.getConnection();
			Statement stm = con.createStatement();
			 
			ResultSet result = stm.executeQuery("SELECT * FROM vendas WHERE cliente_id =" 
			  + codigoCliente ); 
			while (result.next()){
				VendaObj Vo  = new VendaObj();
				Vo.setId(result.getInt("Id"));
				Vo.setCliente_id(result.getInt("Cliente_id"));
				Vo.setNumero_cartao(result.getString("num_cartao"));
				Vo.setCodigo_boleto(result.getString("codigo_boleto"));
				Vo.setNota_fiscal(result.getString("Nota_fiscal"));
				Vo.setPagamento_efetuado(result.getBoolean("Pagamento_Efetuado"));
				Vo.setValor_notal(result.getFloat("valor_total"));
				Vo.setVenda_finalizada(result.getBoolean("Venda_Finalizada"));
				System.out.println(Vo.getValor_notal());
				Resultado.add(Vo);
			}
			result.close();
		} catch(IOException e) {
			System.out.println(e);
			return null;
		} catch(SQLException e) {
			System.out.println(e);
			return null;
		} catch(ClassNotFoundException e) {
			System.out.println(e);
			return null;
		}
		return Resultado;
	}

}
